import json

from flask import current_app, jsonify
from volcenginesdkarkruntime._exceptions import ArkAPIError
from common.ApiResponse import ApiResponse
from common.BaseResponse import BaseResponse
from common.ErrorCode import ErrorCode

system_prompt = '''
请你作为严谨的出题专家，按以下规则生成题目：
输入格式要求：
```
应用名称，
【【【应用描述】】】，
应用类别，
要生成的题目数，
每个题目的选项数
```
在处理之前如果用户没有给出生成的题目数或者选项数目，
则把题目数设置为10，每个题目的选项数设置为4,
如果没说类别，请从用户输入来判断是测评类应用还是得分类应用，一般语文，数学之类的都是得分类，而mbti之类测试人格之类的是测评类

请你根据上述信息，按照以下步骤来出题：
1. 类别判断：
若未填类别，根据应用名称判断：
得分类：涉及学科知识（如语文、数学、四级、编程等）、技能考核的应用。
测评类：涉及人格测试（如 MBTI）、性格评估、能力倾向分析的应用。
2. 题目生成要求：
内容精准：
若应用名称 / 描述具体（如 “四级英语”），题目需紧扣对应知识点（如四级词汇、语法）；
若应用名称 / 描述宽泛（如 “心理健康测试”），题目需覆盖主题核心维度（如情绪管理、压力应对）。
表达简洁：
题目不含序号，选项尽可能简短，避免重复考点。
得分类题目：选项需赋整数分数（如 1、2、3），result留空,设置为null；
测评类题目：选项需赋结果属性值（如 “I”“E”“外向”“内向”），score留空,设置为null。
3. 格式校验：
严格输出 JSON 数组，每个题目包含title和options字段，选项key按 A/B/C/D 顺序排列。
自动剔除题目中隐含的序号（如 “1. 以下哪个正确？”→“以下哪个正确？”）。
4. 严格按照下面的 json 格式输出题目和选项
```
[{"title":"题目标题","options":[{"value":"选项内容","key":"A","result":" ","score":" "},{"value":"","key":"B","result":" ","score":" "}]}]
```
title 是题目，options 是选项，每个选项的 key 按照英文字母序（比如 A、B、C、D）以此类推，value 是选项内容，如果是得分类应用，应当给score赋上一个整数，代表每个选项的分数，result设置为空字符串就行；
反之如果是测评类应用，应当给result赋上一个结果可能的属性值，比如mbti测试中，选A，"result" = "I"如果选B，"result" =“E”,
但是不要出现这种"result": "E/I",一个选项只代表一种属性,score设置为空就行
'''

AI_TEST_SCORING_SYSTEM_MESSAGE = '''
你是一位严谨的判题专家，我会给你如下信息：\n" +
        "```\n" +
        "应用名称，\n" +
        "【【【应用描述】】】，\n" +
        "题目信息和用户选择的列表：格式为 [{\"question\": \"题目\",\"choice\": \"用户选择\"}]\n" 
        "请中一个question的组成模式如下：
        {"title":"题目标题","options":[{"value":"选项内容","key":"A","result":"评判类应用结果","score":"得分类应用得分"}" 
        "\n" +
        "请你根据上述信息，按照以下步骤来对用户进行评价：\n" +
        "1. 要求：需要给出一个明确的评价结果，包括评价名称（尽量简短）和评价描述（尽量详细，大于 200 字）\n" +
        "2. 严格按照下面的 json 格式输出评价名称和评价描述\n" +
        "```\n" +
        "{\"resultName\": \"评价名称\", \"resultDesc\": \"评价描述\"}\n"  如果是得分类应用
        请计算得分并在前面两个的基础上加上一个字段 \"resultScore\": \"用户得分\"
        "3. 返回格式必须为 JSON 对象";
        如果用户做的是某种题目，并且做的不错，推荐用户参加数学竞赛
'''


class douBaoAI(object):
    @classmethod
    async def query(cls, messages: list[str] = None, system_message: str = system_prompt, user_message: str = None,
                    stream: bool = False, temperature: float = 0.3):
        try:
            client = current_app.extensions["async_ark"]
            # 处理参数
            if messages is None:
                if system_message is None or user_message is None:
                    raise ValueError("Either messages or both system_message and user_message must be provided.")
                messages = [system_message, user_message]

            print(type(client.chat.completions.create))
            stream_response = await client.chat.completions.create(
                model="doubao-1-5-pro-32k-250115",
                messages=[
                    {"role": "system", "content": f"你是豆包，是由字节跳动开发的 AI 人工智能助手:{messages[0]}"},
                    {"role": "user", "content": f"{messages[1]}"},
                ],
                stream=stream,
                temperature=temperature,
            )
            data = ""
            async for completion in stream_response:
                print(completion.choices[0].delta.content, end="")
                data += completion.choices[0].delta.content

            print(type(data))
            print(data)
            return data
        except ArkAPIError as e:
            print(e)
            baseResponse = BaseResponse.from_error_code(ErrorCode.OPERATION_ERROR)
            return ApiResponse.error_from_baseResponse(baseResponse=baseResponse, data=str(e))
        except Exception as e:
            print(e)
            baseResponse = BaseResponse.from_error_code(ErrorCode.OPERATION_ERROR)
            return ApiResponse.error_from_baseResponse(baseResponse=baseResponse, data=str(e))
